package com.lyy.service.impl;

import cn.hutool.core.convert.Convert;
import cn.hutool.json.JSONUtil;
import com.lyy.entity.param.CartInsertParam;
import com.lyy.service.CartService;
import com.lyy.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Liangyaoyun
 */
@Service
public class CartServiceImpl implements CartService {

    /*
    * Redis购物车key值前缀
    * */
    private final String CART_KEY_PREFIX="lesson:cart:user-";
    @Autowired
    private RedisUtil redisUtil;

    @Override
    public void insert(CartInsertParam cartInsertParam) {
        //组装key值:使用固定前缀拼接用户的关键字字符串作为key值
        String key=CART_KEY_PREFIX+cartInsertParam.getUserId().toString();
        //组装field值:使用视频的主键字符串作为field值
        String  field=cartInsertParam.getVideoId().toString();
        //组装value值:将整个'cartInsertParam'参数转换为JSON字符串作为value值
        String value=JSONUtil.toJsonStr(cartInsertParam);
        //添加购物车记录
        redisUtil.hSet(key,field,value);
    }

    @Override
    public List<CartInsertParam> selectByUserId(Integer userId) {
        // 组装key值: [固定前缀] 拼接 [用户表主键]
        String key = CART_KEY_PREFIX + userId.toString();
        // 在Redis中，按 [用户表主键] 查询该用户的全部的 [购物车] 记录
        List<Object> objects = redisUtil.hVals(key);
        // 将 List<Object> 类型的数据转换为 List<CartInsertParam> 类型的数据
        List<CartInsertParam> carts = new ArrayList<>();
        objects.forEach(o -> carts.add(JSONUtil.toBean(o.toString(), CartInsertParam.class)));
        return carts;
    }

    @Override
    public void batchDelete(Integer userId, Integer[] videoIds) {
        String key=CART_KEY_PREFIX+userId.toString();
        Object[] nums=Convert.toStrArray(videoIds);
        redisUtil.hDelete(key,nums);
    }

    @Override
    public void deleteByUserId(Integer userId) {
        // 组装key值: 使用固定前缀如拼接用户的主键字符串作为key值
        String key = CART_KEY_PREFIX + userId;
        // 删除指定用户的全部购物车记录
        redisUtil.del(key);
    }
}
